package me.zhengjie.modules.system.repository

import me.zhengjie.modules.system.domain.Role
import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.data.jpa.repository.JpaSpecificationExecutor
import org.springframework.data.jpa.repository.Modifying
import org.springframework.data.jpa.repository.Query

/**
 * @author Kuki Wu
 * @date 2018-12-03
 */
interface RoleRepository : JpaRepository<Role?, Long?>, JpaSpecificationExecutor<Role?> {
    /**
     * 根据名称查询
     * @param name /
     * @return /
     */
    fun findByName(name: String?): Role?
    fun findByUsers_Id(id: Long?): Set<Role?>?



    /**
     * 删除多个角色
     * @param ids /
     */
    fun deleteAllByIdIn(ids: Set<Long?>?)

    /**
     * 根据用户ID查询
     * @param id 用户ID
     * @return /
     */
    @Query(
        value = "SELECT r.* FROM sys_role r, sys_users_roles u WHERE " +
                "r.role_id = u.role_id AND u.user_id = ?1", nativeQuery = true
    )
    fun findByUserId(id: Long?): Set<Role?>?

    /**
     * 解绑角色菜单
     * @param id 菜单ID
     */
    @Modifying
    @Query(value = "delete from sys_roles_menus where menu_id = ?1", nativeQuery = true)
    fun untiedMenu(id: Long?)

    /**
     * 根据部门查询
     * @param deptIds /
     * @return /
     */
    @Query(
        value = "select count(1) from sys_role r, sys_roles_depts d where " +
                "r.role_id = d.role_id and d.dept_id in ?1", nativeQuery = true
    )
    fun countByDepts(deptIds: Set<Long?>?): Int

    /**
     * 根据菜单Id查询
     * @param menuIds /
     * @return /
     */
    @Query(
        value = "SELECT r.* FROM sys_role r, sys_roles_menus m WHERE " +
                "r.role_id = m.role_id AND m.menu_id in ?1", nativeQuery = true
    )
    fun findInMenuId(menuIds: List<Long?>?): List<Role?>?
}